package config

import (
	"encoding/json"
	"io/ioutil"
	"os"
)

type SSDBConf struct {
	Host string `json:"host"`
	Port int    `json:"port"`
}

type MongodbConf struct {
	Addr    string `json:"addr"`
	DB      string `json:"db"`
	Timeout int    `json:"timeout"`
	User    string `json:"user"`
	PWD     string `json:"pwd"`
}

type RedisConf struct {
	Addr string `json:"addr"`
	DB   int    `json:"db"`
}

type WorkerConf struct {
	Concurrent    int         `json:"concurrent"`
	MsgConcurrent int         `json:"msgconcurrent"`
	TaskChLen     int         `json:"taskchlen"`
	MsgChLen      int         `json:"msgchlen"`
	HttpApi       string      `json:"httpapi"`
	HttpsApi      string      `json:"httpsapi"`
	Socks4Api     string      `json:"socks4api"`
	Socks5Api     string      `json:"socks5api"`
	UseType       string      `json:"usetype"` //使用模式 local or server
	IncludeKeys   []string    `json:"includekeys"`
	ClientTimeout int         `json:"clienttimeout"` //使用模式 local or server
	ListemAddr    string      `json:"listenaddr"`    //使用模式 local or server
	SPX           SPXConf     `json:"spx"`
	Reciver       ReciverConf `json:"reciver"`
}

// SPXTypeConf 用户定义不同类型代理要写入的key.
type SPXTypeConf struct {
	SetKeys  []string `json:"set_keys"`
	ListKeys []string `json:"list_keys"`
	ZSetKeys []string `json:"zset_keys"`
}

type SPXConf struct {
	PXChLen      int         `json:"pxchlen"`
	PXConCurrent int         `json:"pxconcurrent"`
	MCollect     string      `json:"mongodbcollent"`
	MDB          string      `json:"mongodb"`
	HTTP         SPXTypeConf `json:"http"`
	HTTPS        SPXTypeConf `json:"https"`
	Socks4       SPXTypeConf `json:"socks4"`
	Socks5       SPXTypeConf `json:"socks5"`
}

type ModelConf struct {
	SSDB    SSDBConf    `json:"ssdb"`
	Redis   RedisConf   `json:"redis"`
	Mongodb MongodbConf `json:"mongodb"`
}

type ReciverFileConf struct {
	Name    string `json:"name"`
	SumTime int64  `json:"sumtime"`
}
type ReciverNsqConf struct {
	Server string `json:"server"`
	Topic  string `json:"topic"`
	Chan   string `json:"chan"`
}
type ReciverRedisConf struct {
	Keys     []string `json:"keys"`
	PopNum   int      `json:"popnum"`
	Interval int      `json:"interval"`
}
type ReciverSSDBConf struct {
	Keys     []string `json:"keys"`
	PopNum   int      `json:"popnum"`
	Interval int      `json:"interval"`
}

type ReciverConf struct {
	File  ReciverFileConf  `json:"file"`
	Nsq   ReciverNsqConf   `json:"nsq"`
	Redis ReciverRedisConf `json:"redis"`
	SSDB  ReciverSSDBConf  `json:"ssdb"`
}

type Config struct {
	Worker WorkerConf `json:"worker"`
	Model  ModelConf  `json:"model"`
}

func ReadConfig(fn string, cfg interface{}) error {
	f, err := os.Open(fn)
	if err != nil {
		return err
	}
	defer f.Close()

	data, err := ioutil.ReadAll(f)
	if err != nil {
		return err
	}

	err = json.Unmarshal(data, cfg)
	if err != nil {
		return err
	}

	return nil
}
